package database;

import triviaException.TriviaException;

/**
 * Clase que almacena un nombre de usuario y puntaje asociado
 * @author Grupo 11 de Programacion Orientada a Objetos
 *
 */

public class Score implements Comparable<Score>, Cloneable {
	private String user;
	private int score;
	
	/* Se declara los setters y getters de user y score como protegidos
	 * para que solo puedan ser alterados por objetos de clase del mismo paquete,
	 * pues es necesario que la clase HighScore devuelva un arreglo con las 10
	 * referencias  a objetos tipo Score en un arreglo a clases en otro paquete.
	 */
	
	/**
	 * Crea una instancia de Score. Por default se la crea
	 * sin nombre de usuario y puntaje 0.
	 */
	
	public Score() {
		super();
        score = 0;
	}
	
	/**
	 * Crea una instancia de Score. Asignando nombre
	 * de usuario y puntaje
	 * @param user - Nombre del usuario
	 * @param score - puntaje
	 */
	
	public Score(String user, int score) throws TriviaException {
		super();
		this.user = user;
		this.score = score;
	}
	
	/**
	 * Consulta el puntaje del usuario
	 */
	
	public int getScore() {
		return score;
	}
	
	/**
	 * Establece un puntaje fijo para el usuario
	 * @param score - puntaje a asignar
	 */
	
	protected void setScore(int score) {
		this.score = score;
	}
	
	/**
	 * Consulta el nombre del usuario
	 * @return String - nombre del usuario
	 */
	
	public String getUser() {
		return user;
	}
	
	/**
	 * Asigna el nombre del usuario
	 * @param user - nombre del usuario
	 */
	
	protected void setUser(String user) {
		this.user = user;
	}
	
	/**
	 * Retorna un hash del score
	 */
	
	@Override
	public int hashCode() {
		final int PRIME = 31;
		int result = 1;
		result = PRIME * result + score;
		result = PRIME * result + ((user == null) ? 0 : user.hashCode());
		return result;
	}
	
	/**
	 * Compara el Score con otro objeto verificando
	 * igualdad semántica.
	 * @return boolean - si son iguales o no
	 */
	
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		final Score other = (Score) obj;
		if (score != other.score)
			return false;
		if (user == null) {
			if (other.user != null)
				return false;
		} else if (!user.equals(other.user))
			return false;
		return true;
	}
	
	/**
	 * Permite clonar un Score
	 * @throws CloneNotSupportedException
	 */
	
	@Override
	protected Object clone() throws CloneNotSupportedException {
		return super.clone();
	}
	
	/**
	 * Permite obtener una representación textual de un
	 * Score formado por el usuario concatenado con su puntaje.
	 * De especial utilidad para la asignación de highscores.
	 * @return String - representación textual de un Score
	 */
	
	@Override
	public String toString() {
		final Integer auxscore;
		
		auxscore = score;
		return (user.toString() + " "  + auxscore.toString() + "\n");
	}

	/**
	 * Permite compararse a otro Score, y decidir si lo
	 * debe preceder o no.
	 * @param o - Score contra el cual compararse
	 * @return int < 0 si debe precederlo, 0 si no importa 
	 * o 1 si no debe precederlo.
	 */
	
	public int compareTo(Score o) {
		return score - o.getScore();
	}

	/**
	 * Aumenta en extrascore el puntaje actual del usuario
	 * @param extrascore - puntaje a adicionarse
	 */
	
    void addToCurrentScore(int extrascore) {
        score += extrascore;
        return;
    }
	
}
